Forgotten file
authorMatthias Clasen <matthiasc@src.gnome.org>
Mon, 4 Apr 2005 21:57:39 +0000 (21:57 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Mon, 4 Apr 2005 21:57:39 +0000 (21:57 +0000)
gtk/xdgmime/xdgmime.c

index 46798aea33fd9ee00b5a895048b1d8d7d2c23a81..51a9c07f6af62fb6f4918af36f84e5b6e2409542 100644 (file)
@@ -35,6 +35,7 @@
 #include "xdgmimemagic.h"
 #include "xdgmimealias.h"
 #include "xdgmimeparent.h"
+#include "xdgmimecache.h"
 #include <stdio.h>
 #include <string.h>
 #include <sys/stat.h>
@@ -55,6 +56,9 @@ static XdgAliasList *alias_list = NULL;
 static XdgParentList *parent_list = NULL;
 static XdgDirTimeList *dir_time_list = NULL;
 static XdgCallbackList *callback_list = NULL;
+XdgMimeCache **caches = NULL;
+int n_caches = 0;
+
 const char *xdg_mime_type_unknown = "application/octet-stream";
 
 
@@ -122,6 +126,28 @@ xdg_mime_init_from_directory (const char *directory)
 
   assert (directory != NULL);
 
+  file_name = malloc (strlen (directory) + strlen ("/mime/mime.cache") + 1);
+  strcpy (file_name, directory); strcat (file_name, "/mime/mime.cache");
+  if (stat (file_name, &st) == 0)
+    {
+      XdgMimeCache *cache = _xdg_mime_cache_new_from_file (file_name);
+
+      if (cache != NULL)
+       {
+         list = xdg_dir_time_list_new ();
+         list->directory_name = file_name;
+         list->mtime = st.st_mtime;
+         list->next = dir_time_list;
+         dir_time_list = list;
+
+         caches = realloc (caches, n_caches + 1);
+         caches[n_caches] = cache;
+         n_caches++;
+
+         return FALSE;
+       }
+    }
+
   file_name = malloc (strlen (directory) + strlen ("/mime/globs") + 1);
   strcpy (file_name, directory); strcat (file_name, "/mime/globs");
   if (stat (file_name, &st) == 0)
@@ -311,6 +337,17 @@ xdg_check_dir (const char *directory,
       return TRUE;
     }
 
+  /* Check the mime.cache file */
+  file_name = malloc (strlen (directory) + strlen ("/mime/mime.cache") + 1);
+  strcpy (file_name, directory); strcat (file_name, "/mime/mime.cache");
+  invalid = xdg_check_file (file_name);
+  free (file_name);
+  if (invalid)
+    {
+      *invalid_dir_list = TRUE;
+      return TRUE;
+    }
+
   return FALSE; /* Keep processing */
 }
 
@@ -395,6 +432,9 @@ xdg_mime_get_mime_type_for_data (const void *data,
 
   xdg_mime_init ();
 
+  if (caches)
+    return _xdg_mime_cache_get_mime_type_for_data (data, len);
+
   mime_type = _xdg_mime_magic_lookup_data (global_magic, data, len);
 
   if (mime_type)
@@ -421,6 +461,9 @@ xdg_mime_get_mime_type_for_file (const char *file_name)
 
   xdg_mime_init ();
 
+  if (caches)
+    return _xdg_mime_cache_get_mime_type_for_file (file_name);
+
   base_name = _xdg_get_base_name (file_name);
   mime_type = xdg_mime_get_mime_type_from_file_name (base_name);
 
@@ -474,6 +517,9 @@ xdg_mime_get_mime_type_from_file_name (const char *file_name)
 
   xdg_mime_init ();
 
+  if (caches)
+    return _xdg_mime_cache_get_mime_type_from_file_name (file_name);
+
   mime_type = _xdg_glob_hash_lookup_file_name (global_hash, file_name);
   if (mime_type)
     return mime_type;
@@ -529,6 +575,9 @@ xdg_mime_get_max_buffer_extents (void)
 {
   xdg_mime_init ();
   
+  if (caches)
+    return _xdg_mime_cache_get_max_buffer_extents ();
+
   return _xdg_mime_magic_get_buffer_extents (global_magic);
 }
 
@@ -539,6 +588,9 @@ xdg_mime_unalias_mime_type (const char *mime_type)
 
   xdg_mime_init ();
 
+  if (caches)
+    return _xdg_mime_cache_unalias_mime_type (mime_type);
+
   if ((lookup = _xdg_mime_alias_list_lookup (alias_list, mime_type)) != NULL)
     return lookup;
 
@@ -604,6 +656,9 @@ xdg_mime_mime_type_subclass (const char *mime,
 
   xdg_mime_init ();
 
+  if (caches)
+    return _xdg_mime_cache_mime_type_subclass (mime, base);
+
   umime = xdg_mime_unalias_mime_type (mime);
   ubase = xdg_mime_unalias_mime_type (base);
 
@@ -638,6 +693,26 @@ xdg_mime_mime_type_subclass (const char *mime,
   return 0;
 }
 
+char **
+xdg_mime_list_mime_parents (const char *mime)
+{
+  const char **parents;
+  char **result;
+  int i, n;
+
+  if (caches)
+    return _xdg_mime_cache_list_mime_parents (mime);
+
+  parents = xdg_mime_get_mime_parents (mime);
+  for (i = 0; parents[i]; i++) ;
+  
+  n = (i + 1) * sizeof (char *);
+  result = (char **) malloc (n);
+  memcpy (result, parents, n);
+
+  return result;
+}
+
 const char **
 xdg_mime_get_mime_parents (const char *mime)
 {